//
//  InitViewController.swift
//  test_swift
//
//  Created by fangyuan ding on 2021/5/31.
//

import UIKit

class InitViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        //对于值类型和引用类型，默认构造器是不同的。如果 class 给所有的存储属性赋了默认值，且没有实现任何自定义的构造器，那么 Swift 会提供一个默认的构造器。

//        struct Celsius {
//            var temperatureInCelsius: Double
//            init(fromFahrenheit fahrenheit: Double) {
//                temperatureInCelsius = (fahrenheit - 32.0) / 1.8
//            }
//            init(fromKelvin kelvin: Double) {
//                temperatureInCelsius = kelvin - 273.15
//            }
//        }
//        let boilingPointOfWater = Celsius(fromFahrenheit: 212.0)
//        print(boilingPointOfWater)
//        // boilingPointOfWater.temperatureInCelsius is 100.0
//        let freezingPointOfWater = Celsius(fromKelvin: 273.15)
//        // freezingPointOfWater.temperatureInCelsius is 0.0
//        print(freezingPointOfWater)

//        class SurveyQuestion {
//            var text: String
//            var response: String?
//            init(text: String) {
//                self.text = text
//            }
//            func ask() {
//                print(text)
//            }
//        }
//        let cheeseQuestion = SurveyQuestion(text: "Do you like cheese?")
//        cheeseQuestion.ask()
//        // Prints "Do you like cheese?"
//        cheeseQuestion.response = "Yes, I do like cheese."
        
//        class PotatoPepperEggplant {
//            let potato: String;
//            let pepper: String;
//            let eggplant: String
//
//            init(potato: String, pepper: String, eggplant: String) {
//                //给每一个存储属性赋初始值
//                self.potato = potato
//                self.pepper = pepper
//                self.eggplant = eggplant
//                //执行其他必须的设置
//                cook()
//            }
//
//            func cook() {
//                //do something
//            }
//        }
//        let ppe = PotatoPepperEggplant(potato: "????", pepper: "????", eggplant: "????")
//        print("now you can eat\(ppe)")
        
//        class PotatoPepperEggplant {
//            let potato = "????";
//            let pepper = "????";
//            let eggplant = "????"
//            init() {
//                cook()
//            }
//
//            func cook() {}
//        }
//        let ppe = PotatoPepperEggplant()
//        print("now you can eat\(ppe)")
//
//        class ShoppingListItem {
//            var name: String?
//            var quantity = 1
//            var purchased = false
//
//        }
//        let item = ShoppingListItem()
//        print(item)
        
//
//        struct Size {
//            //var width, height: Double 也会提供默认构造器
//            var width = 0.0, height = 0.0
//        }
//        let twoByTwo = Size(width: 2.0, height: 2.0)
//        print(twoByTwo)
        //而对于 struct ，只要没有实现任何自定义构造器，不管它有没有给存储属性赋默认值， Swift 都会提供默认构造器。
//
//        struct Celsius {
//            var temperatureInCelsius: Double
//            init(fromFahrenheit fahrenheit: Double) {
//                temperatureInCelsius = (fahrenheit - 32.0) / 1.8
//            }
//            init(fromKelvin kelvin: Double) {
//                temperatureInCelsius = kelvin - 273.15
//            }
//        }
//        let boilingPointOfWater = Celsius(fromFahrenheit: 212.0)
//        print(boilingPointOfWater)
//         boilingPointOfWater.temperatureInCelsius 是 100.0let freezingPointOfWater = Celsius(fromKelvin: 273.15)
//         freezingPointOfWater.temperatureInCelsius 是 0.0复制代码
        
//        struct Color {
//            let red, green, blue: Double
//
//            init(red: Double, green: Double, blue: Double) {
//                self.red   = red
//                self.green = green
//                self.blue  = blue
//            }
//
//            init(white: Double) {
//                red   = white
//                green = white
//                blue  = white
//            }
//        }
//        let magenta = Color(red: 1.0, green: 0.0, blue: 1.0)
//        let halfGray = Color(white: 0.5)
//        print(magenta)
//        print(halfGray)
//
//        // this reports a compile-time error - argument labels are required复制代码
        
//        struct Celsius {
//            var temperatureInCelsius: Double
//            init(fromFahrenheit fahrenheit: Double) {
//                temperatureInCelsius = (fahrenheit - 32.0) / 1.8
//            }
//            init(fromKelvin kelvin: Double) {
//                temperatureInCelsius = kelvin - 273.15
//            }
//            init(_ celsius: Double) {
//                temperatureInCelsius = celsius
//            }
//        }
//        let bodyTemperature = Celsius(37.0)
//        print(bodyTemperature)
        // bodyTemperature.temperatureInCelsius is 37.0复制代码
        
        
//        class SurveyQuestion {
//            var text: String
//            var response: String?
//            init(text: String) {
//                self.text = text
//            }
//            func ask() {
//                print(text)
//            }
//        }
//        let cheeseQuestion = SurveyQuestion(text: "Do you like cheese?")
//        cheeseQuestion.ask()
        
        // Prints "Do you like cheese?"cheeseQuestion.response = "Yes, I do like cheese."复制代码
//
//        class SurveyQuestion {
//            let text: String
//            var response: String?
//            init(text: String) {
//                self.text = text
//            }
//            func ask() {
//                print(text)
//            }
//        }
//        let beetsQuestion = SurveyQuestion(text: "How about beets?")
//        beetsQuestion.ask()
//        // 打印“How about beets?”
//        beetsQuestion.response = "I also like beets. (But not with cheese.)"
//        //值类型的构造器代理
//
//
//        struct Size {
//            var width = 0.0, height = 0.0
//        }
//
//        struct Point {
//            var x = 0.0, y = 0.0
//        }
//
//        struct Rect {
//            var origin = Point()
//            var size = Size()
//            init() {}
//
//            init(origin: Point, size: Size) {
//                self.origin = origin
//                self.size = size
//            }
//
//            init(center: Point, size: Size) {
//                let originX = center.x - (size.width / 2)
//                let originY = center.y - (size.height / 2)
//                self.init(origin: Point(x: originX, y: originY), size: size)
//            }
//        }
        
//        extension Rect {
//            init(center: Point, size: Size) {
//                let originX = center.x - (size.width / 2)
//                let originY = center.y - (size.height / 2)
//                self.init(origin: Point(x: originX, y: originY), size: size)
//            }
//        }
        //类的构造器代理,为了确保实例中的所有存储属性都能有初始值， Swift 提供了两种构造器，分别是：指定构造器、便利构造器。
//        class Animal {
//            var head = 1
//        }
//
//        class Dog: Animal {
//            var foot: Int
//            override init() {
//                foot = 4
//                //这句也可以省略，它默认是隐式调用的。
//                super.init()
//                head = 2
//                // 如果上面的未完成，是不能调用run()的，因为self还没有完整的创建
//                run()
//            }
//            func run() {
//                   //do something
//               }
//            convenience init(foot: Int) {
//                //先调用其他构造器，如果此处不调用会编译出错
//                self.init()
//                //再为任意属性（包括所有同类中定义的）赋新值
//                self.foot = foot
//                head = 3
//            }
//        }
        
//        规则 1
//        如果子类没有定义任何指定构造器，它将自动继承父类所有的指定构造器。
//        规则 2
//        如果子类提供了所有父类指定构造器的实现——无论是通过规则 1
//        继承过来的，还是提供了自定义实现——它将自动继承父类所有的便利构造器。

//        class Animal {
//            let head = 1
//            var name = ""
//            init(name: String) {
//                self.name = name
//            }
//
//            convenience init() {
//                self.init(name: "animal")
//            }
//        }
//
//        class Dog: Animal {
//            let foot  = 4
//        }
//
        
        //自动继承父类所有的指定构造let d1 = Dog(name: "dog") // d1.name dog
        //自动继承父类所有的便利构造器let d2 = Dog() // d2.name animal复制代码
        
//        class Vehicle {
//            var numberOfWheels = 0
//            var description: String {return "\(numberOfWheels) wheel(s)"}
//        }
//
//        class Bicycle: Vehicle {
//            override init() {
//                super.init()
//                numberOfWheels = 2
//            }
//        }
//
//        struct Animal {
//            let species: String
//            init?(species: String) {
//                if species.isEmpty {return nil
//              }
//                self.species = species
//            }
//            // 可失败构造器不能与其他非可失败构造器（指定构造器、便利构造器）的参数和类型相同
//            //所以下面这个指定构造器是非法的。
//            //init(species: String) { }
//        }
        
//        class Animal {
//            var name: String
//            required init(name: String) {
//                self.name = name
//            }
//        }
//
//        class Dog: Animal {
//            var foot: Int
//            //在重写父类必要构造器的时候不需要加override
//            required init(name: String) {
//                foot = 4
//                super.init(name: name)
//            }
//        }
//
//        print(Dog(name: "dog"))
        
        class Animal {
            var name: String
            required init(name: String) {
                self.name = name
            }
        }

        class Dog: Animal {
            var foot = 2
        }

        Dog(name: "dog")
        
        
        class CustomTableViewCell: UITableViewCell {
            override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
                super.init(style: style, reuseIdentifier: reuseIdentifier)

            }

            required init?(coder aDecoder: NSCoder) {
                fatalError("init(coder:) has not been implemented")
            }
        }
        
       
        
    }
    


}
